const { secret, expiration } = require('../config/config')
const jwt = require('jsonwebtoken')

/**
 * 除了jwt官方提供的一些标准定义的字段
 * 我们在此自定义一些与我们系统业务相关的数据字段
 * 但因为此部分只会进行base64编码,base64是可逆的，所以不要存放隐私数据例如：用户密码
  */ 
const payload = {
  // 签发人
  iss: 'myself',
  // 过期时间（默认为两个小时），是一串时间戳
  exp: 0,
  // 受众
  aud: 'all',
  // 签发时间
  iat: 0,
  // 自定义数据
  dataField: 'xxx'
}

function getPayload() {
  let nowTime = new Date().getTime()
  // 设置Token有效期为当前时间往后延迟2小时
  let exp = nowTime + expiration
  payload.exp = exp
  payload.iat = nowTime
  return payload
}

/**
 * 将header and payload base64后根据密钥生成签名
 * @return {string} token
 */
function generateJWT() {
  const payload = getPayload()
  const token = jwt.sign(payload,
  secret, 
  {
    algorithm: 'HS256'
  })
  return token
}

/**
 * 传入一串JWT字符串，返回此JWT是否有效的布尔值
 * @param {string} token 
 */
function verifyJWT(token) {
  try {
    const payload = jwt.verify(token, secret)
    const { exp } = payload
    const diff = new Date().getTime() - exp
    // 当前时间减去Token有效期的时间戳如果为负数或者差异时间大于设定的有效期则认为Token无效
    if (diff > expiration) {
      return false
    } else {
      return true
    }
  } catch (e) {
    return false;
  }
}

module.exports = {
  generateJWT,
  verifyJWT
}
